# -*- coding: utf-8 -*-
"""
用户服务类
处理用户相关的业务逻辑
"""

from typing import List, Optional
from app.models.user import User, UserCreate, UserUpdate


class UserService:
    """
    用户服务类
    负责用户数据的CRUD操作和业务逻辑处理
    """
    
    def __init__(self):
        """初始化用户服务，使用内存存储模拟数据库"""
        self._users: List[dict] = []
        self._next_id: int = 1
    
    async def create_user(self, user_data: UserCreate) -> User:
        """
        创建新用户
        
        Args:
            user_data: 用户创建数据
            
        Returns:
            User: 创建的用户对象
            
        Raises:
            ValueError: 当邮箱已存在时抛出异常
        """
        # 检查邮箱是否已存在
        if await self._email_exists(user_data.email):
            raise ValueError(f"邮箱 {user_data.email} 已存在")
        
        # 创建用户
        user_dict = user_data.model_dump()
        user_dict["id"] = self._next_id
        self._next_id += 1
        
        self._users.append(user_dict)
        return User(**user_dict)
    
    async def get_all_users(self) -> List[User]:
        """
        获取所有用户
        
        Returns:
            List[User]: 用户列表
        """
        return [User(**user) for user in self._users]
    
    async def get_user_by_id(self, user_id: int) -> Optional[User]:
        """
        根据ID获取用户
        
        Args:
            user_id: 用户ID
            
        Returns:
            Optional[User]: 用户对象，不存在时返回None
        """
        for user in self._users:
            if user["id"] == user_id:
                return User(**user)
        return None
    
    async def update_user(self, user_id: int, user_data: UserUpdate) -> Optional[User]:
        """
        更新用户信息
        
        Args:
            user_id: 用户ID
            user_data: 更新数据
            
        Returns:
            Optional[User]: 更新后的用户对象，不存在时返回None
        """
        for i, user in enumerate(self._users):
            if user["id"] == user_id:
                # 只更新提供的字段
                update_data = user_data.dict(exclude_unset=True)
                
                # 检查邮箱是否与其他用户冲突
                if "email" in update_data:
                    if await self._email_exists(update_data["email"], exclude_id=user_id):
                        raise ValueError(f"邮箱 {update_data['email']} 已存在")
                
                self._users[i].update(update_data)
                return User(**self._users[i])
        return None
    
    async def delete_user(self, user_id: int) -> Optional[User]:
        """
        删除用户
        
        Args:
            user_id: 用户ID
            
        Returns:
            Optional[User]: 被删除的用户对象，不存在时返回None
        """
        for i, user in enumerate(self._users):
            if user["id"] == user_id:
                deleted_user = self._users.pop(i)
                return User(**deleted_user)
        return None
    
    async def _email_exists(self, email: str, exclude_id: Optional[int] = None) -> bool:
        """
        检查邮箱是否已存在
        
        Args:
            email: 邮箱地址
            exclude_id: 排除的用户ID（用于更新时检查）
            
        Returns:
            bool: 邮箱是否存在
        """
        for user in self._users:
            if user["email"] == email and user["id"] != exclude_id:
                return True
        return False
    
    async def get_user_count(self) -> int:
        """
        获取用户总数
        
        Returns:
            int: 用户总数
        """
        return len(self._users)
    
    async def clear_all_users(self) -> None:
        """
        清空所有用户（主要用于测试）
        """
        self._users.clear()
        self._next_id = 1